package com.chigga.common.aspect;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * 计时切面类
 */
@Aspect
@Slf4j
@Component
public class TimeAspect {

    /**
     * 切入点
     * // execution(修饰符(可省略) 返回值 包名.类名.方法名(参数列表) 抛出异常（可省略）)
     * // @annotation(com.chigga.common.annotation.xxx)
     */
    @Pointcut("execution(* com.chigga.*.service.*.*(..))")
    private void allServicePointCut() {}

    /**
     * 环绕通知 (方法执行前和执行完后触发)
     * @param proceedingJoinPoint 切入点
     * @return 执行结果
     */
    @Around("allServicePointCut()")
    public Object timeAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        // 开始执行时间
        long startTime = System.currentTimeMillis();
        // 调用原始目标方法运行
        Object result = proceedingJoinPoint.proceed();
        // 获取原始目标类名
        String className = proceedingJoinPoint.getTarget().getClass().getName();
        // 获取原始目标方法名
        String methodName = proceedingJoinPoint.getSignature().getName();
        // 结束执行时间
        long endTime = System.currentTimeMillis();
        // 执行时间差 ms
        long differTime = endTime - startTime;
        log.info("执行类名：{}， 方法名：{}， 耗时: {} ms", className, methodName, differTime);
        return result;
    }

}
